package com.taskmanage
{

	import com.taskmanage.TaskObj;

	import flash.events.TimerEvent;
	import flash.utils.Timer;

	/**
	 * 任务管理器,主要是为了保证系统中只有一个Timer在跑,多个Timer跑起来时间会很不准
	 * @author Boder
	 * @Time 2011-9-6 16:17:33
	 */
	public class ImTaskManager
	{
		private static var __imTask  :  ImTaskManager;

		private var taskArr  :  Array   =  []; //任务库
		private var timer  :  Timer     =  null; //任务执行者
		private var timeGap  :  int     =  250; //每次执行间隔
		private var taskId  :  Number   =  0; //进程id,每增加一个任务值加1,避免重复
		private var curTime  :  Number  =  0; //当前执行次数

		public function ImTaskManager()
		{
			if(__imTask != null)
				throw new Error("ImTaskManager 只能实例化一次.");
		}

		/**
		 * 执行任务
		 * @param event
		 *
		 */
		protected function doTimerTask(event  :  TimerEvent)  :  void
		{
			curTime++;

			for each(var tObj  :  TaskObj in taskArr)
			{
				tObj.doTask(curTime);
			}

			curTime  =  curTime > 1000000 ? 0 : curTime; //大于100W重新置0
		}

		/**
		 *添加一个任务
		 * @param task 任务对象
		 *
		 */
		public function addTask(task  :  TaskObj)  :  void
		{
			task.countGap(timeGap);
			task.taskId  =  taskId++; //进程id
			task.startTime  =  curTime; //起点时间
			taskArr.push(task);

			if(!timer)
			{
				timer  =  new Timer(timeGap);
				timer.start();
				timer.addEventListener(TimerEvent.TIMER, doTimerTask);
			}
		}

		/**
		 * 删除一个任务
		 * @param task 要删除的任务对象
		 */
		public function removeTask(task  :  TaskObj)  :  void
		{
			var i_len  :  int  =  taskArr.length;

			for(var i  :  int  =  0; i < i_len; i++)
			{
				var tobj  :  TaskObj  =  taskArr[i] as TaskObj;

				if(tobj.taskId == task.taskId)
				{ //找到对象,删除这个对象
					taskArr  =  taskArr.slice(i, 1);
					break;
				}
			}

			if(tobj)
			{
				tobj.fun  =  null;
				tobj  =  null;
			}

		}

		/**
		 *清理注销
		 *
		 */
		public function cancel()  :  void
		{
			timer.removeEventListener(TimerEvent.TIMER, doTimerTask);
			timer.stop();
			timer  =  null;

			var i_len  :  int  =  taskArr.length;

			for(var i  :  int  =  0; i < i_len; i++)
			{
				var tobj  :  TaskObj  =  taskArr[i] as TaskObj;
				tobj.fun  =  null;
				tobj  =  null;
			}

			taskArr.slice(0);
		}

		/**
		 *获取实例
		 *
		 */
		public static function getInstance()  :  ImTaskManager
		{
			if(!__imTask)
				__imTask  =  new ImTaskManager();
			return __imTask;
		}
	}
}
